From 34a1c27e8fa021f66e8e02e1de5d6723bcfc9e3f Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Thu, 31 Jul 2014 10:20:33 -0700 Subject: [PATCH] Use precise if it's there --- src/cargo/core/resolver.rs | 3 ++- src/cargo/sources/git/source.rs | 11 +++++++++-- src/cargo/sources/git/utils.rs | 6 ++++-- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/cargo/core/resolver.rs b/src/cargo/core/resolver.rs index 579ae7f7e..cb97b83d3 100644 --- a/src/cargo/core/resolver.rs +++ b/src/cargo/core/resolver.rs @@ -104,7 +104,8 @@ impl> Decodable for EncodablePackageId { fn decode(d: &mut D) -> Result { let string: String = raw_try!(Decodable::decode(d)); let regex = regex!(r"^([^ ]+) ([^ ]+)(?: \(([^\)]+)\))?$"); - let captures = regex.captures(string.as_slice()).expect("invalid serialized PackageId"); + let captures = regex.captures(string.as_slice()) + .expect("invalid serialized PackageId"); let name = captures.at(1); let version = captures.at(2); diff --git a/src/cargo/sources/git/source.rs b/src/cargo/sources/git/source.rs index 5f0c1e3dd..61759e65e 100644 --- a/src/cargo/sources/git/source.rs +++ b/src/cargo/sources/git/source.rs @@ -23,7 +23,8 @@ pub struct GitSource<'a, 'b> { } impl<'a, 'b> GitSource<'a, 'b> { - pub fn new<'a, 'b>(source_id: &SourceId, config: &'a mut Config<'b>) -> GitSource<'a, 'b> { + pub fn new<'a, 'b>(source_id: &SourceId, + config: &'a mut Config<'b>) -> GitSource<'a, 'b> { assert!(source_id.is_git(), "id is not git, id={}", source_id); let reference = match source_id.kind { @@ -40,6 +41,11 @@ impl<'a, 'b> GitSource<'a, 'b> { let checkout_path = config.git_checkout_path() .join(ident.as_slice()).join(reference.as_slice()); + let reference = match source_id.precise { + Some(ref s) => s, + None => reference, + }; + GitSource { remote: remote, reference: GitReference::for_str(reference.as_slice()), @@ -163,7 +169,8 @@ impl<'a, 'b> Source for GitSource<'a, 'b> { self.remote.db_at(&self.db_path) }; - let checkout = try!(repo.copy_to(self.reference.as_slice(), &self.checkout_path)); + let checkout = try!(repo.copy_to(self.reference.as_slice(), + &self.checkout_path)); let source_id = self.source_id.with_precise(checkout.get_rev().to_string()); let path_source = PathSource::new(&self.checkout_path, &source_id); diff --git a/src/cargo/sources/git/utils.rs b/src/cargo/sources/git/utils.rs index 3f15e8462..3a3a0a583 100644 --- a/src/cargo/sources/git/utils.rs +++ b/src/cargo/sources/git/utils.rs @@ -182,7 +182,10 @@ impl GitDatabase { let checkout = try!(GitCheckout::clone_into(dest, self.clone(), GitReference::for_str(reference.as_slice()))); - try!(checkout.fetch()); + if self.remote.has_ref(dest, reference.as_slice()).is_err() { + try!(checkout.fetch()); + } + try!(checkout.reset(reference.as_slice())); try!(checkout.update_submodules()); Ok(checkout) @@ -264,7 +267,6 @@ impl GitCheckout { // In this case we just use `origin` here instead of the database path. git!(self.location, "fetch", "--force", "--quiet", "origin"); git!(self.location, "fetch", "--force", "--quiet", "--tags", "origin"); - try!(self.reset(self.revision.as_slice())); Ok(()) } -- 2.30.2